
#pragma once

static void prn( const char * name, Obj * o )
{
    static FILE * f = 0;
    if( !f )
    {
        f = stderr;
        //f = fopen( "c:/TEMP/out-free.txt", "wb" );
        //f = fopen( "c:/TEMP/out-no-free.txt", "wb" );
    }
    
    fputs( name, f );
    fputs( " = ", f );
    print_obj( o, f );
    fputs( "\r\n", f );

    fflush( f );
}

static void test_list_bug0( AllocContext * ac )
{
    List *        l1;
    List *        l2;
    List *        l3;
    int             i;

    printf( "sizeof(List) = 0x%02X\n", sizeof(List) );

    for( i = 0; i < (128 * 32 - 1); ++ i )
    {
        alloc_list( ac );
    }

    l1 = alloc_list( ac );
    l2 = alloc_list( ac );
    l3 = alloc_list( ac );
    printf( "1) 0x%08X 0x%08X 0x%08X\n", l1, l2, l3 );
    free_list( ac, l2 );
    free_list( ac, l3 );
    l2 = alloc_list( ac );
    l3 = alloc_list( ac );
    printf( "1) 0x%08X 0x%08X 0x%08X\n", l1, l2, l3 );
}

static void test_list_bug( AllocContext * ac )
{
    List *        l1 = alloc_list( ac );
    List *        l2 = alloc_list( ac );

    List *        l3 = alloc_list( ac );
    list_add( ac, l3, alloc_int_num(ac, 45) );
    list_add( ac, l3, alloc_str(ac, "L3") );

    list_push( ac, l1, alloc_str(ac, "END_ZONE") );

    list_push( ac, l2, alloc_int_num(ac, 2) );

    list_push( ac, l1, l2 );
    list_push( ac, l1, l3 );

    printf( "---------\n" );
    prn( "before pop l1", l1 );
    prn( "l1->car", l1->car );
    prn( "l1->cdr", l1->cdr );

    printf( "---------\n" );
    {
        Obj * ol3 = list_pop( ac, l1 );
        prn( "after pop l1", l1 );
        prn( "l1->car", l1->car );
        prn( "l1->cdr", l1->cdr );
        //list_add( ac, l1->car, ol3 );
        prn( "l1", l1 );
    }
}
